package com.urbainski.estagio.negocio;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;

import com.urbainski.dao.bo.GenericBO;
import com.urbainski.estagio.entidade.Curso;
import com.urbainski.estagio.entidade.Professor;
import com.urbainski.estagio.entidade.Usuario;

/**
 * @author Cristian Elder Urbainski
 * @since 25/12/2011
 */

public class UsuarioBO extends GenericBO{

	@SuppressWarnings("unchecked")
	public List<Usuario> buscarUsuariosPorTipo(Integer tpUser, Integer idCurso) throws Exception {

		if(idCurso == null){
			return (List<Usuario>) getUrbainskiDao().getSessao().createCriteria(Usuario.class)
					.createAlias("professor", "professor", Criteria.INNER_JOIN)
					.createAlias("professor.endereco", "professor.endereco", Criteria.INNER_JOIN)
					.add(Restrictions.eq("tpUsuario", tpUser))
					.list();
		} else {
			List<Usuario> listaUsuario = getUrbainskiDao().getSessao().createCriteria(Usuario.class)
					.createAlias("professor", "professor", Criteria.INNER_JOIN)
					.createAlias("professor.endereco", "professor.endereco", Criteria.INNER_JOIN)
					.add(Restrictions.and(Restrictions.eq("tpUsuario", tpUser),
							Restrictions.eq("tpUsuario", tpUser)))
							.list();

			List<Usuario> ret = new ArrayList<Usuario>();

			for (Usuario usuario : listaUsuario) {
				if(usuario.getProfessor().getListaCurso() != null){
					for (Curso curso : usuario.getProfessor().getListaCurso()) {
						if(curso.getIdCurso() == idCurso){
							ret.add(usuario);
						}
					} 
				} else {
					usuario.getProfessor().setListaCurso(null);
				}
			}

			return ret;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Usuario> buscarTodosUsuarios() throws Exception {
		try {

			List<Usuario> listaUser =  (List<Usuario>) getUrbainskiDao().getSessao().createCriteria(Usuario.class)
					.createAlias("professor", "professor", Criteria.INNER_JOIN)
					.createAlias("professor.endereco", "professor.endereco", Criteria.INNER_JOIN)
					.list();

			for (Usuario usuario : listaUser) {
				if(usuario.getProfessor() == null) {
					usuario.setProfessor(new Professor());
					usuario.getProfessor().setEndereco(null);
					usuario.getProfessor().setNmProfessor("Administrador");
				}
			}

			return listaUser;
		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		}

	}


	public Usuario salvarUsuario(Usuario user, Boolean enviarEmail) throws Exception {
		try {
			getUrbainskiDao().beginTras();

			if(user.getProfessor() != null){
				getUrbainskiDao().salvar(user.getProfessor().getEndereco());
				user.getProfessor().setIdEndereco(user.getProfessor().getEndereco().getIdEndereco());
				getUrbainskiDao().salvar(user.getProfessor());
				user.setIdProfessor(user.getProfessor().getIdProfessor());
			}

			getUrbainskiDao().salvar(user);

			if(enviarEmail){
				new EmailBO().enviarEmailCadastroSistema(user);
			}

			getUrbainskiDao().commitTrans();
		} catch (Exception e) {
			e.printStackTrace();
			getUrbainskiDao().rollbackTrans();
			throw e;
		}

		return user;
	}

	public Usuario alterarUsuario(Usuario user, Boolean enviarEmail) throws Exception {
		try {
			getUrbainskiDao().beginTras();

			if(user.getProfessor() != null){
				getUrbainskiDao().altualizar(user.getProfessor().getEndereco());
				getUrbainskiDao().altualizar(user.getProfessor());
			}

			getUrbainskiDao().altualizar(user);

			if(enviarEmail){
				new EmailBO().enviarEmailCadastroSistema(user);
			}

			getUrbainskiDao().commitTrans();
		} catch (Exception e) {
			e.printStackTrace();
			getUrbainskiDao().rollbackTrans();
			throw e;
		}

		return user;
	}

	public boolean excluirUsuario(Usuario user) throws Exception {
		try {
			getUrbainskiDao().beginTras();

			getUrbainskiDao().excluir(user);

			if(user.getProfessor() != null){
				getUrbainskiDao().excluir(user.getProfessor());
				getUrbainskiDao().excluir(user.getProfessor().getEndereco());
			}

			getUrbainskiDao().commitTrans();
		} catch (Exception e) {
			e.printStackTrace();
			getUrbainskiDao().rollbackTrans();
			throw e;
		}

		return true;
	}

}